package com.rw.coco.service;

import com.rw.coco.api.data.PersistenceMapper;
import com.rw.coco.api.data.model.AccountModel;
import com.rw.coco.api.data.model.CharacterPropertyModel;
import com.rw.tool.util.string.StringUtil;

import java.util.Optional;
import java.util.Set;

/**
 * 角色相关方法
 */
public class CharacterPropertyService extends BaseService {
    public CharacterPropertyService(PersistenceMapper mapper) {
        super(mapper);
    }

    /**
     * 寻找用户的某个属性
     *
     * @param characterId 角色ID
     * @param propName    属性名称
     * @return 属性
     */
    public Optional<CharacterPropertyModel> getProp(int characterId, String propName) {
        // 查出角色所有的属性
        Set<CharacterPropertyModel> properties = characterPropertyMapper.getProperties(characterId);
        // 查找角色对应的属性
        return getPropFromSet(properties, propName);
    }

    /**
     * 寻找用户的某个属性
     *
     * @param accountModel 角色
     * @param propName     属性名称
     * @return 属性
     */
    public Optional<CharacterPropertyModel> getProp(AccountModel accountModel, String propName) {
        return getPropFromSet(getAllProp(accountModel), propName);
    }

    /**
     * 寻找用户的全部属性
     *
     * @param accountModel 角色
     * @return 属性集合
     */
    public Set<CharacterPropertyModel> getAllProp(AccountModel accountModel) {
        // 获得角色ID
        CharacterService characterService = new CharacterService(mapper);
        int characterId = characterService.getOrDefault(accountModel).getCharacterId();
        return characterPropertyMapper.getProperties(characterId);
    }

    /**
     * 寻找用户是否有某个属性
     *
     * @param characterId 角色ID
     * @param propName    属性名称
     * @return 属性
     */
    public boolean contains(int characterId, String propName) {
        return getProp(characterId, propName).isPresent();
    }

    /**
     * 寻找用户是否有某个属性
     *
     * @param accountModel 角色
     * @param propName     属性名称
     * @return 属性
     */
    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
    public boolean contains(AccountModel accountModel, String propName) {
        // 获得角色ID
        CharacterService characterService = new CharacterService(mapper);
        int characterId = characterService.getOrDefault(accountModel).getCharacterId();

        return getProp(characterId, propName).isPresent();
    }

    /**
     * 从set中找到对应的属性
     *
     * @param properties 属性set
     * @param propName   属性名
     * @return 属性的 Optional
     */
    public static Optional<CharacterPropertyModel> getPropFromSet(Set<CharacterPropertyModel> properties,
                                                                  String propName) {
        return properties.stream()
                .filter(model -> StringUtil.equals(model.getPropertiesName(), propName))
                .findFirst();
    }

    /**
     * 增加某个属性的属性值
     *
     * @param accountModel 用户模型
     * @param propName     属性名
     * @param addValue     属性值
     */
    public void addPropValue(AccountModel accountModel, String propName, int addValue) {
        // 获得角色ID
        CharacterService characterService = new CharacterService(mapper);
        int characterId = characterService.getOrDefault(accountModel).getCharacterId();

        // 增加属性值
        characterPropertyMapper.addPropValue(characterId, propName, addValue);
    }
}
